// CPPGameServer.cpp: 定义应用程序的入口点。
//

#include <iostream>
#include "CommDef.h"
#include "CProcessAttribute.h"
#include "CConfigParser.h"
#include "CLogger.h"
#include "CMemory.h"
#include "CCRC32.h"
#include "CSignal.h"
#include "CProcessCycle.h"
#include "CThreadPool.h"
#include "CLogicSocket.h"
#include <arpa/inet.h>

CThreadPool g_clThreadPool;
CLogicSocket g_clLogicSocket;

using namespace std;

int main(int argc, char **argv)
{
	int iExitCode = 0;
	// 初始化进程属性
	CProcessAttribute::init(argc, argv, PROCESS_MASTER);

	// 初始化配置
	CConfigParser* pConfig = CConfigParser::getInstance();
	if (!pConfig->load("server.conf"))
	{
		CLogger::logInit();
		CLogger::logStderr(0, "配置文件[%s]载入失败，退出！", "server.conf");
		iExitCode = 2;
		goto lblExit;
	}

	// 初始化内存单例类
	CMemory::getInstance();

	// 初始化CRC32校验算法
	CCRC32::getInstance();

	// 日志初始化
	CLogger::logInit();

	// 信号初始化
	if (CSignal::initSignals() != 0) {
		iExitCode = 1;
		goto lblExit;
	}

	// socket初始化
	if (g_clLogicSocket.init() == false)
	{
		iExitCode = 1;
		goto lblExit;
	}

	// 创建守护进程
	if (pConfig->getIntDefault("Daemon", 0) == 1)	//都配置文件，拿到配置文件中是否按守护进程方式启动的选项
	{
		int nDaemonResult = CProcessAttribute::becomeDaemon();
		if (nDaemonResult == -1)
		{
			iExitCode = 1;
			goto lblExit;
		}
		if (nDaemonResult == 1)
		{
			// 这是原始的父进程
			CProcessAttribute::deInit();
			CLogger::deInit();
			iExitCode = 0;
			return iExitCode;
		}
	}

	// 开始正式的主工作流程，主流程一直在下边这个函数里循环，暂时不会走下来，资源释放啥的日后再慢慢完善和考虑
	CProcessCycle::masterProcessCycle();

lblExit:
	// 释放资源
	CLogger::logStderr(0, "程序退出！");
	CProcessAttribute::deInit();
	CLogger::deInit();
	return 0;
}
